<?php
namespace App\Core\Entity\Auth;

use App\Services\Base\Auth\UserService as AuthUserService;

class UserEntity extends Factory
{

    /**
     * 用户数据内部 key（重定向地址）
     */
    const KEY_REDIRECT_URI = 'redirect_uri';

    public function __construct(array $data = [])
    {
        // 初始化数据
        if (! count($data)) {
            $data = $this->initAuthData();
        }
        parent::__construct($data);
    }

    /**
     * 初始化数据
     *
     * @return array
     */
    public function initAuthData()
    {
        // 获取授权token
        $authToken = $this->getAuthToken();
        // 从缓存中获取数据并永久存储
        $data = cache()->rememberForever($this->makeAuthKey(), function () use ($authToken) {
            // 不存在则从数据库获取
            $authUserService = new AuthUserService();
            return $authUserService->getUserToken($authToken);
        });
        return $data;
    }

    /**
     * 制作缓存Key
     *
     * @return string
     */
    public function makeAuthKey()
    {
        return self::AUTH_KEY_USER . ':' . $this->getAuthToken();
    }

    /**
     * 验证用户是否登录
     *
     * @return boolean
     */
    public function isValid()
    {
        return $this->offsetExists('token') && $this->offsetGet('token') == $this->getAuthToken();
    }

    /**
     * 获取token
     *
     * @return NULL | token
     */
    public function getToken()
    {
        return $this->isValid() ? $this->offsetGet('token') : null;
    }

    /**
     * 获取用户ID
     *
     * @return NULL | user_type
     */
    public function getUserId()
    {
        return $this->isValid() ? $this->offsetGet('user_id') : null;
    }

    /**
     * 获取用户类型
     *
     * @return NULL | user_type
     */
    public function getUserType()
    {
        return $this->isValid() ? $this->offsetGet('user_type') : null;
    }

    /**
     * 获取用户数据
     *
     * @return array
     */
    public function getUser()
    {
        return $this->isValid() ? $this->getArrayCopy() : [];
    }

    public function save()
    {
        if ($this->count()) {
            // 保存数据到 auth（永久存储）
            cache()->forever($this->makeAuthKey(), $this->getArrayCopy());
        } else {
            // 删除数据到 auth
            cache()->forget($this->makeAuthKey());
        }
    }

    /**
     * 析构函数，同步数据到 auth
     */
    public function __destruct()
    {
        $this->save();
    }
}
